iT邦幫忙

2024 iThome 鐵人賽

DAY 7
0
Software Development

RISC-V 與處理器之架構學習及應用系列 第 7

[Day07] RISC-V Data Transfer 資料轉移

  • 分享至 

  • xImage
  •  

一、RISC-V Data Transfer

1. Data Transfer

  • 涉及將數據從記憶體 load 到 registers,或將 registers 中的數據 store 回記憶體中。
  • registers:是非常快速的小型儲存空間,位於 CPU 內部,每次只能存取少量的數據,但速度極快。其存取速度通常在0.25納秒以內。

2. RISC-V 的指令概述

  • 在RISC-V中,可以使用各種指令來完成 Data Transfer 和運算操作:
    • add rd, rs1, rs2:將來自 rs1rs2 兩個 registers 的值相加,結果存入 rd registers 中。
    • sub rd, rs1, rs2:將 rs1 registers 中的值減去 rs2 中的值,結果存入 rd
    • addi rd, rs1, imm:將 rs1 中的值與立即數 imm 相加,結果存入 rd 中。
    • lw rd, offset(rs1):從記憶體中載入資料,偏移量由 offset 指定,將結果存入 rd
    • sw rs2, offset(rs1):將 rs2 中的數據存到 rs1 指定的記憶體位址,偏移量由 offset 指定。

二、RISC-V Data Transfer的運作流程:

1. 從記憶體載入資料到 registers

  • lw (Load Word) 指令:用來從記憶體載入 32 位元的資料(1 字 = 4 個位元組)到 registers 中。
    範例
    lw x10, 12(x15)  # 從 x15 指定的記憶體位址加上 12 的偏移量,載入資料到 x10。
    
    • 這裡的 x15 是基址 registers,記憶體位址為 x15 中儲存的地址加上偏移量 12
    • 偏移量 是指與基址相加的數值,單位為位元組。

2. 將 registers 的資料存到記憶體

  • sw (Store Word) 指令:用來將 32 位元的資料從 registers 存到記憶體。
    範例
    sw x10, 40(x15)  # 將 x10 中的資料存到 x15 基址加 40 的記憶體位址。
    
    • 這裡的 x15 是基址寄存器,偏移量是 40 位元組。

3. 位元組資料載入與存儲

  • lb (Load Byte)sb (Store Byte) 指令用來處理單一位元組的載入和存儲。
    lb 會將記憶體中的一個位元組載入到 registers 中,並進行符號擴展,而 lbu 則會將載入的位元組進行無符號擴展。

三、記憶體位址與大小端序

1. 記憶體位址是以 Bytes 為單位

  • 位元組 (Byte):每個位元組是 8 位元(bit)。在 RISC-V 中,資料的最小單位是位元組。
  • 字 (Word):在 32 位元架構中,1 個字 = 4 個位元組,因此每 4 個位元組就會有一個位址。
  • 記憶體位址實際上是以位元組為單位的,而不是以字為單位。也就是說,如果你要存取一個字,它的位址間隔是 4 個位元組。
  • 指標 (Pointer) 是一個記憶體位址,我們可以對其進行加減以找到正確的記憶體位址進行訪問。

2. Big Endian (大端序) vs Little Endian (小)

  • 描述了數據在記憶體中的儲存順序:
    • Big Endian:高位元組儲存在低位址。例如 1025 的數值在大端序中,高位的 1 會被放在低位址處。
    • Little Endian:低位元組儲存在低位址。是 RISC-V 的預設模式,即低位元組放在低位址。即,數值的低位元組會先被儲存。

四、資料存取速度與記憶體層次

1. registers 與記憶體的速度比較

  • registers:容量非常有限,但存取速度極快,通常只有 128 Bytes。速度最快,但容量非常小。
  • DRAM 記憶體:容量非常大(數 GB 到數十 GB),但存取速度遠低於 registers。大約慢 50 到 500 倍。速度較慢,但價格便宜,容量相對較大。
  • 這是因為物理規律告訴我們「越小的東西越快」,registers 由於體積小且直接位於 CPU 內,因此非常快速。
  • Jim Gray:存取暫存器只需 1 納秒,這像是從頭部拿取資料,而存取記憶體需要耗費更長的時間,類似於需要 1.5 小時才能從遠處拿到資料。

五、資料載入與存儲操作範例

1. 從記憶體載入資料到 registers

  • 範例
    lw x10, 12(x15)  # 從 x15 基址加 12 的位址,載入資料到 x10。
    
    • 這會將記憶體中位於 x15 基址加上 12 偏移量的值載入到 x10

2. 將 registers 的資料存到記憶體

  • 範例
    sw x10, 40(x15)  # 將 x10 中的數據存入到 x15 基址加 40 的記憶體位址。
    
    • 這會將 x10 registers 中的資料存到 x15 基址加上 40 偏移量的位置。

上一篇
[Day06] 工具介紹:Ripes
下一篇
[Day08] RISC-V 決策和邏輯運算
系列文
RISC-V 與處理器之架構學習及應用21
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言